home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d2 / uneedit.arc / SYSID32.ARC / SYSID.INC < prev    next >
Text File  |  1988-12-17  |  13KB  |  613 lines

  1. (*
  2. **  SYSID.INC
  3. **
  4. **  The user functions and procedures for SYSID.PAS.
  5. **
  6. **  Steve Grant
  7. **  Long Beach, CA
  8. **  July 8,1988
  9. *)
  10.  
  11. function cpuid : word;
  12.  
  13. (*
  14. **  Returns in AX a word describing the host CPU and coprocessor:
  15. **    AH7-AH4 = 0 (not used)
  16. **    AH3     = 1 if interrupts corrupt multi-prefix string instructions
  17. **    AH2     = 1 if PUSH SP writes, then decrements SP
  18. **    AH1     = 1 if shift instructions use only lower five bits of second
  19. **                register operand
  20. **    AH0     = 1 if prefetch instruction queue is six bytes
  21. **    AL      = 0 if no coprocessor present
  22. **              1 if 8087 present
  23. **              2 if 80287 present
  24. *)
  25.  
  26. external;
  27. (*$L CPUID *)
  28.  
  29. function scan(a : str9; b, c, d : word; var e : word) : boolean;
  30.  
  31. var
  32.   i : longint;
  33.   j : byte;
  34.   len : byte;
  35.   xbool1 : boolean;
  36.   xbool2 : boolean;
  37.  
  38. begin
  39.   i := c;
  40.   len := length(a);
  41.   xbool1 := false;
  42.   repeat
  43.     if i <= longint(d) - len + 1 then begin
  44.       j := 0;
  45.       xbool2 := false;
  46.       repeat
  47.         if j < len then
  48.           if upcase(chr(mem[b : i + j])) = a[j + 1] then
  49.             inc(j)
  50.           else begin
  51.             xbool2 := true;
  52.             inc(i)
  53.           end
  54.         else begin
  55.           xbool2 := true;
  56.           xbool1 := true;
  57.           e := i;
  58.           scan := true
  59.         end
  60.       until xbool2
  61.     end else begin
  62.       xbool1 := true;
  63.       scan := false
  64.     end
  65.   until xbool1
  66. end;
  67.  
  68. function BIOSscan(a, b, c : word; var d : word) : boolean;
  69.  
  70. const
  71.   max = 3;
  72.   notice : array[1..max] of str9 = ('(C)', 'COPR.', 'COPYRIGHT');
  73.  
  74. var
  75.   i : 1..max;
  76.   len : byte;
  77.   target : str9;
  78.   xbool : boolean;
  79.   xlong : longint;
  80.   xword : word;
  81.  
  82. begin
  83.   xlong := c;
  84.   xbool := false;
  85.   for i := 1 to max do begin
  86.     target := notice[i];
  87.     len := length(target);
  88.     if xbool then
  89.       xlong := longint(xword) - 2 + len;
  90.     if (xlong >= b) and (xlong <= c) and (scan(target, a, b, xlong, xword))
  91.       then
  92.       xbool := true
  93.   end;
  94.   if xbool then begin
  95.     while (xword > b) and (chr(mem[a : xword - 1]) in pchar1) do
  96.       dec(xword);
  97.     d := xword
  98.   end;
  99.   BIOSscan := xbool
  100. end;
  101.  
  102. procedure BIOSunk(var a, b : word);
  103.  
  104. begin
  105.   a := seg(strunk);
  106.   b := ofs(strunk) + 1
  107. end;
  108.  
  109. function diskread(drive : byte; start, sectors : word; var buffer) : word;
  110.  
  111. (*
  112. **  Returns 0 if no error, else the error value from DOS.
  113. **
  114. **  This function was written by Terje Mathisen (BIX name "terjem").
  115. *)
  116.  
  117. begin
  118.   inline($1E /                          (* PUSH DS                         *)
  119.          $55 /                          (* PUSH BP                         *)
  120.          $8A / $46 / <drive /           (* MOV  AL,[BP+drive]              *)
  121.          $8B / $56 / <start /           (* MOV  DX,[BP+start]              *)
  122.          $8B / $4E / <sectors /         (* MOV  CX,[BP+sectors]            *)
  123.          $C5 / $5E / <buffer /          (* LDS  BX,[BP+buffer]             *)
  124.          $CD / $25 /                    (* INT  25H                        *)
  125.          $72 / $02 /                    (* JC   error                      *)
  126.          $31 / $C0 /                    (* XOR  AX,AX                      *)
  127.                                         (* error:                          *)
  128.          $59 /                          (* POP  CX                         *)
  129.                                         (* ;fix broken stack               *)
  130.          $5D /                          (* POP  BP                         *)
  131.          $1F /                          (* POP  DS                         *)
  132.          $89 / $46 / $FE)               (* MOV  [BP-2],AX                  *)
  133.                                         (* ;TP4 local copy of return value *)
  134. end;
  135.  
  136. procedure rjustify(a : string);
  137.  
  138. var
  139.   i : byte;
  140.  
  141. begin
  142.   for i := wherex to twidth - 1 - length(a) do
  143.     write(' ');
  144.   write(a)
  145. end;
  146.  
  147. procedure border;
  148.  
  149. const
  150.   ch = '═';
  151.  
  152. var
  153.   i : byte;
  154.  
  155. begin
  156.   for i := 1 to twidth - 1 do
  157.     write(ch)
  158. end;
  159.  
  160. procedure caption1(a : string);
  161.  
  162. begin
  163.   textcolor(lightgray);
  164.   write(a);
  165.   textcolor(lightgreen)
  166. end;
  167.  
  168. procedure caption2(a : string);
  169.  
  170. const
  171.   capterm = ': ';
  172.  
  173. var
  174.   i : byte;
  175.   xbool : boolean;
  176.  
  177. begin
  178.   i := length(a);
  179.   while (i > 0) and (a[i] = ' ') do
  180.     dec(i);
  181.   insert(capterm, a, i + 1);
  182.   caption1(a)
  183. end;
  184.  
  185. function intinit(a : byte) : boolean;
  186.  
  187. begin
  188.   intinit := (intseg[a] > $0000) or (intofs[a] > $0000)
  189. end;
  190.  
  191. function nocarry : boolean;
  192.  
  193. begin
  194.   nocarry := regs.flags and fcarry = $0000
  195. end;
  196.  
  197. function hex(a : word; b : byte) : str4;
  198.  
  199. const
  200.   digit : array[$0..$F] of char = '0123456789ABCDEF';
  201.  
  202. var
  203.   i : byte;
  204.   xstring : str4;
  205.  
  206. begin
  207.   xstring := '';
  208.   for i := 1 to b do begin
  209.     insert(digit[a and $000F], xstring, 1);
  210.     a := a shr 4
  211.   end;
  212.   hex := xstring
  213. end;
  214.  
  215. procedure unknown(a : string; b : word; c : byte);
  216.  
  217. begin
  218.   writeln('(unknown', ' ', a, ' ', hex(b, c), ')')
  219. end;
  220.  
  221. function cbw(a, b : byte) : word;
  222.  
  223. begin
  224.   cbw := a shl 8 + b
  225. end;
  226.  
  227. function bin4(a : byte) : str4;
  228.  
  229. const
  230.   digit : array[0..1] of char = '01';
  231.  
  232. var
  233.   xstring : str4;
  234.   i : byte;
  235.  
  236. begin
  237.   xstring := '';
  238.   for i := 3 downto 0 do begin
  239.     insert(digit[a mod 2], xstring, 1);
  240.     a := a shr 1
  241.   end;
  242.   bin4 := xstring
  243. end;
  244.  
  245. function bin8(a : byte) : str9;
  246.  
  247. begin
  248.   bin8 := bin4(a shr 4) + '_' + bin4(a and $0F)
  249. end;
  250.  
  251. procedure showBIOS(a, b : word);
  252.  
  253. var
  254.   xbool : boolean;
  255.   xchar : char;
  256.  
  257. begin
  258.   xbool := false;
  259.   repeat
  260.     xchar := chr(mem[a : b]);
  261.     if xchar in pchar1 then begin
  262.       write(xchar);
  263.       if b < $FFFF then
  264.         inc(b)
  265.       else
  266.         xbool := true
  267.     end else
  268.       xbool := true
  269.   until xbool;
  270.   writeln
  271. end;
  272.  
  273. procedure dontknow;
  274.  
  275. begin
  276.   writeln(strunk)
  277. end;
  278.  
  279. procedure yesorno(a : boolean);
  280.  
  281. begin
  282.   if a then
  283.     write('yes')
  284.   else
  285.     write('no ')
  286. end;
  287.  
  288. procedure segofs(a, b : word);
  289.  
  290. begin
  291.   write(hex(a, 4), ':', hex(b, 4))
  292. end;
  293.  
  294. function showchar(a : char) : char;
  295.  
  296. begin
  297.   if a in pchar2 then
  298.     showchar := a
  299.   else
  300.     showchar := '.'
  301. end;
  302.  
  303. procedure EMMerr(a : byte);
  304.  
  305. begin
  306.   case a of
  307.     $80 : writeln('internal error in EMM software');
  308.     $81 : writeln('malfunction in expanded memory hardware');
  309.     $82 : writeln('memory manager busy');
  310.     $83 : writeln('invalid handle');
  311.     $84 : writeln('undefined function');
  312.     $85 : writeln('no more handles available');
  313.     $86 : writeln('error in save or restore of mapping context');
  314.     $87 : writeln('not enough physical pages available');
  315.     $88 : writeln('not enough free pages available');
  316.     $89 : writeln('no pages requested');
  317.     $8A : writeln('logical page outside range assigned to handle');
  318.     $8B : writeln('invalid physical page number');
  319.     $8C : writeln('page map hardware state save area full');
  320.     $8D : writeln('mapping context already in save area');
  321.     $8E : writeln('mapping context not in save area');
  322.     $8F : writeln('undefined subfunction parameter')
  323.     else
  324.       unknown('expanded memory error', a, 2)
  325.   end
  326. end;
  327.  
  328. procedure pause;
  329.  
  330. var
  331.   xbyte : byte;
  332.   xchar : char;
  333.  
  334. begin
  335.   if wherey + topline = tlength - 1 then begin
  336.     xbyte := textattr;
  337.     textcolor(green);
  338.     write('(Press any key to continue)');
  339.     repeat
  340.     until keypressed;
  341.     while keypressed do
  342.       xchar := readkey;
  343.     clrscr;
  344.     writeln('(continued)');
  345.     textattr := xbyte
  346.   end
  347. end;
  348.  
  349. procedure showMCB(MCB, ownerPID, parent, size : word);
  350.  
  351. var
  352.   i : word;
  353.   xbool : boolean;
  354.   xchar : char;
  355.   xlong1 : longint;
  356.   xlong2 : longint;
  357.   xlong3 : longint;
  358.   xstring : string[12];
  359.   xword : word;
  360.  
  361. begin
  362.   xlong1 := $10 * longint(size);
  363.   if parent = devseg then
  364.     xstring := 'CONFIG.SYS'
  365.   else if ownerPID = parent then
  366.     xstring := 'COMMAND.COM'
  367.     (*   BIX ms.dos/secrets #1496   *)
  368.   else if (ownerPID = $0000) or (ownerPID = prefixseg) then
  369.     xstring := '(free)'
  370.   else begin
  371.     xword := memw[ownerPID : $002C];
  372.     i := 0;
  373.     while memw[xword : i] > $0000 do
  374.       inc(i);
  375.     inc(i, 7);
  376.     xstring := '';
  377.     xbool := false;
  378.     repeat
  379.       xchar := chr(mem[xword : i]);
  380.       if xchar in pchar2 then begin
  381.         if xchar = '\' then
  382.           xstring := ''
  383.         else
  384.           xstring := xstring + xchar;
  385.         inc(i)
  386.       end else begin
  387.         xbool := true;
  388.         if xchar > #0 then
  389.           xstring := ''
  390.       end
  391.     until xbool;
  392.   end;
  393.   write(hex(MCB, 4), qspace3, hex(ownerPID, 4), qspace3, hex(parent, 4), '  '
  394.     , qspace3, xlong1 : 6, qspace3, xstring);
  395.   if MCB + 1 = ownerPID then begin
  396.     for i := length(xstring) + 1 to 12 do
  397.       write(' ');
  398.     write(qspace3);
  399.     xlong2 := $10 * longint(ownerPID);
  400.     for i := $00 to $FF do begin
  401.       xlong3 := $10 * longint(intseg[i]) + intofs[i];
  402.       if (xlong2 <= xlong3) and (xlong3 <= xlong2 + xlong1) then begin
  403.         if wherex > twidth - 3 then begin
  404.           writeln;
  405.           pause;
  406.           write('    ', qspace3, '    ', qspace3, '      ', qspace3, '      '
  407.             , qspace3, '            ', qspace3)
  408.         end;
  409.         write(hex(i, 2), ' ');
  410.       end
  411.     end
  412.   end;
  413.   writeln
  414. end;
  415.  
  416. procedure showcolor(a : byte);
  417.  
  418. begin
  419.   case(a) of
  420.     black        : write('black');
  421.     blue         : write('blue');
  422.     green        : write('green');
  423.     cyan         : write('cyan');
  424.     red          : write('red');
  425.     magenta      : write('magenta');
  426.     brown        : write('brown');
  427.     lightgray    : write('light gray');
  428.     darkgray     : write('dark gray');
  429.     lightblue    : write('light blue');
  430.     lightgreen   : write('light green');
  431.     lightcyan    : write('light cyan');
  432.     lightred     : write('light red');
  433.     lightmagenta : write('light magenta');
  434.     yellow       : write('yellow');
  435.     white        : write('white')
  436.     else
  437.       unknown('color', a, 2)
  438.   end
  439. end;
  440.  
  441. procedure offoron(a : byte);
  442.  
  443. begin
  444.   if a = $00 then
  445.     write('off')
  446.   else
  447.     write('on')
  448. end;
  449.  
  450. procedure zeropad(a : byte);
  451.  
  452. begin
  453.   if a < 10 then
  454.     write('0');
  455.   write(a)
  456. end;
  457.  
  458. procedure showvers;
  459.  
  460. var
  461.   xchar : char;
  462.  
  463. begin
  464.   xchar := chr(country[9]);
  465.   if osmajor > 0 then begin
  466.     write(osmajor, xchar);
  467.     zeropad(osminor);
  468.     writeln
  469.   end else
  470.     writeln('1', xchar, 'x')
  471. end;
  472.  
  473. procedure showecho(a : word);
  474.  
  475. var
  476.   xbyte : byte;
  477.  
  478. begin
  479.   xbyte := mem[DOScseg : a];
  480.   case xbyte of
  481.     $00 : writeln('off');
  482.     $FF : writeln('on')
  483.     else
  484.       unknown('status', xbyte, 2)
  485.   end
  486. end;
  487.  
  488. procedure showbufs(a : word);
  489.  
  490. const
  491.   bufsmax = 99;
  492.  
  493. var
  494.   i : byte;
  495.   xbool : boolean;
  496.   xword1 : word;
  497.   xword2 : word;
  498.   xword3 : word;
  499.  
  500. begin
  501.   i := 0;
  502.   xword1 := memw[DOScseg : a];
  503.   xword2 := memw[DOScseg : a + 2];
  504.   xbool := false;
  505.   repeat
  506.     if i <= bufsmax then begin
  507.       if xword1 < $FFFF then begin
  508.         inc(i);
  509.         xword3 := xword1;
  510.         xword1 := memw[xword2 : xword3];
  511.         xword2 := memw[xword2 : xword3 + 2]
  512.       end else begin
  513.         xbool := true;
  514.         writeln(i)
  515.       end
  516.     end else begin
  517.       xbool := true;
  518.       dontknow
  519.     end
  520.   until xbool
  521. end;
  522. (*   BIX ms.dos/secrets #2   *)
  523.  
  524. procedure muxint(a : string; b : byte);
  525.  
  526. var
  527.   xbyte : byte;
  528.  
  529. begin
  530.   caption2(qindent + a);
  531.   with regs do begin
  532.     AX := b shl 8;
  533.     intr($2F, regs);
  534.     xbyte := AL;
  535.     case xbyte of
  536.       $00 : writeln('no; OK to install');
  537.       $01 : writeln('no; not OK to install');
  538.       $FF : writeln('yes')
  539.       else
  540.         unknown('status', xbyte, 2)
  541.     end
  542.   end
  543. end;
  544.  
  545. function bin16(a : word) : str19;
  546.  
  547. begin
  548.   bin16 := bin8(hi(a)) + '_' + bin8(lo(a))
  549. end;
  550.  
  551. procedure drvname(a : byte);
  552.  
  553. begin
  554.   write(chr(ord('A') + a), ': ')
  555. end;
  556.  
  557. procedure media(a : byte);
  558.  
  559. procedure diskette(a, b : byte);
  560.  
  561. begin
  562.   writeln('diskette (', a, '-sided, ', b, ' sectors)')
  563. end;
  564.  
  565. begin (* procedure media *)
  566.   caption2(qindent + 'Media');
  567.   case a of
  568.     $FF : diskette(2, 8);
  569.     $FE : diskette(1, 8);
  570.     $FD : diskette(2, 9);
  571.     $FC : diskette(1, 9);
  572.     $F9 : diskette(2, 15);
  573.     $F8 : writeln('fixed disk')
  574.     else
  575.       unknown('media', a, 2)
  576.   end
  577. end;
  578.  
  579. procedure drvparms(a : byte; b : string);
  580.  
  581. var
  582.   i : byte;
  583.   xbool : boolean;
  584.  
  585. begin
  586.   i := 0;
  587.   xbool := false;
  588.   repeat
  589.     if i < $80 then
  590.       with regs do begin
  591.         AH := $08;
  592.         DL := a + i;
  593.         intr($13, regs);
  594.         if AH = $00 then begin
  595.           pause;
  596.           inc(i);
  597.           writeln(b, qspace4, i : 3, '   ', qspace4, DL : 3, '     ', qspace4
  598.             , DH + 1 : 3, '  ', qspace4, cbw((CL and $C0) shr 6, CH) + 1 : 4
  599.             , '     ', qspace4, CL and $3F : 2)
  600.         end else
  601.           xbool := true
  602.       end
  603.     else
  604.       xbool := true
  605.   until xbool
  606. end;
  607. (*   PC Magazine 7:5 p.339   *)
  608.  
  609. (*
  610. ** end subprograms
  611. *)
  612.  
  613.